home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / Dev / Amiga-E / E_v3.2a / Src / Various / dokkenou / dokkenou.e (.txt) < prev    next >
LaTeX Document  |  1992-09-02  |  5KB  |  198 lines

  1. -> DokkeNou!
  2. OPT OSVERSION=37, PREPROCESS
  3. MODULE 'tools/file', 'tools/ctype'
  4. DEF slist:PTR TO LONG,snum,scur=0,ofh=NIL,tabwidth=8,
  5.     detailstemp[1000]:STRING,style
  6. PROC main() HANDLE
  7.   DEF m=NIL,l,args:PTR TO LONG,rdargs=NIL,texf[100]:STRING,x
  8.   args:=[0,0,0,0,0,0]
  9.   IF (rdargs:=ReadArgs('TEXT/A,TEXFILE,TABWIDTH/K/N,STYLE,A4/S,A4COL/S',args,NIL))=NIL THEN Raise("ARGS")
  10.   IF args[1]
  11.     texf:=args[1]
  12.   ELSE
  13.     IF (x:=InStr(args[0],'.'))<1 THEN x:=ALL
  14.     StrCopy(texf,args[0],x)
  15.     StrAdd(texf,'.tex')
  16.   ENDIF
  17.   IF args[2] THEN tabwidth:=Long(args[2])
  18.   style:=IF args[3] THEN args[3] ELSE ''
  19.   IF args[4] THEN style:='[a4din]'
  20.   IF args[5] THEN style:='[a4din,twocolumn]'
  21.   WriteF('DokkeNou! (c) 1994 Text2Tex conversion by Wouter\n' +
  22.          'converting "\s" to "\s"\n',args[0],texf)
  23.   m,l:=readfile(args[0])
  24.   snum:=countstrings(m,l)
  25.   slist:=stringsinfile(m,l,snum)
  26.   IF (ofh:=Open(texf,NEWFILE))=NIL THEN Raise("OPEN")
  27.   all()
  28. EXCEPT DO
  29.   IF rdargs THEN FreeArgs(rdargs)
  30.   IF m THEN freefile(m)
  31.   IF ofh THEN Close(ofh)
  32.   SELECT exception
  33.     CASE "ARGS"; WriteF('Bad Args!\n')
  34.     CASE "EOF";  WriteF('Done.\n')
  35.     DEFAULT;     WriteF('exception: "\s" (\h), info: "\s"\n',
  36.                  [exception,0],exception,IF exceptioninfo THEN exceptioninfo ELSE '')
  37.   ENDSELECT
  38. ENDPROC
  39. PROC next(n) IS IF scur+n<snum THEN slist[scur+n] ELSE ''
  40. PROC getnext() IS scur++ BUT IF scur<snum THEN slist[scur] ELSE Raise("EOF")
  41. #define GETCUR slist[scur]
  42. #define SKIP scur++
  43. #define BACK scur--
  44. PROC put(s) IS Fputs(ofh,s)
  45. PROC putln(s) IS Fputs(ofh,s) BUT FputC(ofh,"\n")
  46. PROC iswhite(c) IS (c=" ") OR (c="\t")
  47. PROC isnotwhite(c) IS (c<>" ") AND (c<>"\t")
  48. PROC spaces(s)
  49.   DEF n=0
  50.   LOOP
  51.     IF s[]=" "
  52.       n++
  53.     ELSEIF s[]="\t"
  54.       n:=n+tabwidth
  55.     ELSE
  56.       RETURN n,s
  57.     ENDIF
  58.     s++
  59.   ENDLOOP
  60. ENDPROC
  61. PROC all() HANDLE
  62.   DEF str[3]:ARRAY OF LONG,a=0,s,d
  63.   REPEAT
  64.     s:=GETCUR
  65.     d,s:=spaces(s)
  66.     IF s[] THEN str[a++]:=s
  67.     getnext()
  68.   UNTIL a=3
  69.   put('% generated by DokkeNou! (tm) text2tex formatting utility (c) Wouter 1994\n\n')
  70.   put('\\documentstyle')
  71.   put(style)
  72.   put('{article}\n')
  73.   put('\\title{')
  74.   put(str[0])
  75.   put('}\n\\author{')
  76.   put(str[1])
  77.   put('}\n\\date{')
  78.   put(str[2])
  79.   put('}\n')
  80.   put('\\begin{document}\\maketitle\n')
  81.   process()
  82. EXCEPT DO
  83.   putln('\\end{document}')
  84.   ReThrow()
  85. ENDPROC
  86. PROC process(indent=0)
  87.   DEF s,sn,sp,spn,numblank=0
  88.   s:=GETCUR
  89.   LOOP
  90.     s[-1]:=" "
  91.     IF s[]
  92.       IF numblank>1 THEN putln('\\vskip .0cm\\noindent ')
  93.       numblank:=0
  94.     ELSE
  95.       numblank++
  96.     ENDIF
  97.     sp,s:=spaces(s)
  98.     IF sp<indent THEN RETURN
  99.     spn,sn:=spaces(next(1))
  100.     IF StrCmp(sn,'====',STRLEN)
  101.       put('\\section{'); put(details(s)); put('}\n')
  102.       SKIP
  103.     ELSEIF StrCmp(sn,'----',STRLEN)
  104.       put('\\subsection{'); put(details(s)); put('}\n')
  105.       SKIP
  106.     ELSEIF StrCmp(sn,'****',STRLEN)
  107.       put('\\subsubsection{'); put(details(s)); put('}\n')
  108.       SKIP
  109.     ELSEIF (s[]=">") AND iswhite(s[1])
  110.       verbatim(s)
  111.     ELSEIF ((s[]="*") OR (s[]="-")) AND iswhite(s[1])
  112.       itemize(s,s[],sp)
  113.     ELSE
  114.       putln(details(s))
  115.     ENDIF
  116.     s:=getnext()
  117.   ENDLOOP
  118. ENDPROC
  119. PROC itemize(s,ic,ind) HANDLE
  120.   DEF d
  121.   put('\\begin{itemize}\n')
  122.   REPEAT
  123.     put('\\item ')
  124.     putln(details(s+2))
  125.     SKIP
  126.     process(ind+2)
  127.     d,s:=spaces(GETCUR)
  128.   UNTIL (s[]<>ic) OR isnotwhite(s[1])
  129.   BACK
  130. EXCEPT DO
  131.   put('\\end{itemize}\n')
  132.   ReThrow()
  133. ENDPROC
  134. PROC verbatim(s) HANDLE
  135.   DEF d
  136.   put('\\begin{verbatim}\n')
  137.   REPEAT
  138.     putln(s+1)
  139.     d,s:=spaces(getnext())
  140.   UNTIL (s[]<>">") OR isnotwhite(s[1])
  141.   BACK
  142. EXCEPT DO
  143.   put('\\end{verbatim}\n')
  144.   ReThrow()
  145. ENDPROC
  146. PROC details(s)
  147.   DEF r
  148.   IF StrLen(s)>500 THEN RETURN 'TOO LONG'
  149.   r:=detailstemp
  150.   s,r:=dodet(s,r,0)
  151.   r[]:=0
  152. ENDPROC detailstemp
  153. PROC dorange(s,r,end,text,c)
  154.   IF iswhite(s[-2])
  155.     AstrCopy(r,text)
  156.     r:=r+StrLen(text)
  157.     s,r:=dodet(s,r,end)
  158.     r[]++:="}"
  159.   ELSE
  160.     r[]++:=c
  161.   ENDIF
  162. ENDPROC s,r
  163. PROC dodet(s,r,stop)
  164.   DEF c
  165.   WHILE c:=s[]++
  166.     IF c=stop THEN RETURN s,r
  167.     SELECT 128 OF c
  168.       CASE "#","$","%","&","~","^","\\","{","}"     ->,"|",">","<"
  169.         r[]++:="\\"
  170.         r[]++:=c
  171.       CASE "["
  172.         s,r:=dorange(s,r,"]",'\\footnote{',c)        -> footnotes
  173.       CASE "_"
  174.         IF isgraph(s[])
  175.           s,r:=dorange(s,r,"_",'{\\em ',c)        -> emphasized
  176.         ELSE
  177.           r[]++:="\\"
  178.           r[]++:=c
  179.         ENDIF
  180.       CASE "*"
  181.         s,r:=dorange(s,r,"*",'{\\bf ',c)        -> bold
  182.       CASE "`"
  183.         IF iswhite(s[-2])                -> inline verbatim
  184.           AstrCopy(r,'\\verb|')
  185.           r:=r+STRLEN
  186.           WHILE ((c:=s[]++)<>"'") AND (c<>0) DO r[]++:=c
  187.           IF c=0 THEN s--
  188.           r[]++:="|"
  189.         ELSE
  190.           r[]++:=c
  191.         ENDIF
  192.       DEFAULT                        -> normal chars
  193.         r[]++:=c
  194.     ENDSELECT
  195.   ENDWHILE
  196.   s--
  197. ENDPROC s,r
  198.